package com.itheima.service.impl;

import com.itheima.dao.UserDao;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
/*
* @Component    使用在类上,表示这个类可以被spring实例化成一个bean
* @Controll     使用在web层,和@Component作用一样,只是名字更形象
* @Service     使用在service层,和@Component作用一样,只是名字更形象
* @Repository     使用在dao层,和@Component作用一样,只是名字更形象
* @Autowired    使用在字段上,表示此字段时会被自动赋值的,找class,所以必须唯一,否则加qualifier
* @Qualifier   和@Autowired一起使用,按照id匹配
* @Resource    相当于@Autowired + @Qualifier
* @Value      使用在字段上,表示此字段时会被自动赋值的.适用于注入普通属性
* @Scope       bean的性质,单例或多例等
* */

/*
* @Configuration   用于指定当前类是一个Spring的配置类.当创建容器时会从该类上加载注解.相当于指定了applicationContext.xml
* @ConponentScan   用于指定Spring在初始化容器时要扫描的包,作用和在Spring的xml配置文件中的<context:component-scan base-package="com.itheima"/>一样
* @Bean            使用在方法上,标注将该方法的返回值存储到Spring容器中.主要用于对一些非自己写的类,想自动生成
* @PropertySource  用于加载properties文件中的配置.  <context:property-placeholder location="jdbc.properties"/>
* @Import          用于导入其他的配置文件.便于配置文件拆分,查看
*
*
* */
//<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
//<property name="userDao" ref="userDao"/>
//</bean>
//@Component(value = "userService")
@Service(value = "userService")
@Scope("singleton")//默认
public class UserServiceImpl implements UserService {
    //注解方式注入普通属性
//    @Value("itcast")
    @Value("${jdbc.driver}")
    private String driver;

    //<property name="userDao" ref="userDao"/>
    //单独autowired找class,所以必须唯一,否则加qualifier
//    @Autowired
//    @Qualifier("userDao") //按照id匹配,但是必须与autowired一起使用
    @Resource(name = "userDao") //相当于Autowired + Qualifier
    private UserDao userDao;

    //xml配置通过set方法
    //注解方式不通过set
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void save() {
        System.out.println(driver);
        userDao.save();
    }

    //构造方法之后执行
    @PostConstruct
    public void init(){
        System.out.println("init");
    }
    //销毁之前执行
    @PreDestroy
    public void destory(){
        System.out.println("destory");
    }
}
